package com.qf.air.controller;

import com.github.pagehelper.PageInfo;
import com.qf.air.entity.Air;
import com.qf.air.service.AirService;
import com.qf.air.util.R;
import com.qf.air.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.io.IOException;
import java.util.Date;

/**
 * @Author: 维多利加
 * @Date: 2021/3/24 14:43
 */
@RestController
@RequestMapping(value = "/air")
@CrossOrigin(allowCredentials = "true")
public class AirController {

    @Autowired
    private AirService airService;

    /**
     查询空气质量信息
     #请求路径和请求方式
     GET		http://localhost:8080/air/list
     # 请求参数
     page = 当前页(int)
     rows = 每页显示条数(int)
     districtId = 区域的标识(int)
     */
    @RequestMapping(value = "/list",method = RequestMethod.GET)
    public String list(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(value = "limit",defaultValue = "5") Integer rows,Integer districtId,String monitoringStation,
            String startTime,
            String endTime) throws IOException {

        String result = airService.findByPageAndDistrictId(page,rows , districtId,monitoringStation,startTime,endTime);

        //封装数据
        return result;
    }

    /** 添加空气质量信息
     * # 请求路径和请求方式
     * POST	http://localhost:8080/air/add
     * # 请求参数
     *   districtId = 区域标识（int）
     *   monitoringTime = 检测日期（Date）
     *   pm10 = pm10数值（int）
     *   pm25 = pm2.5数值（int）
     *   monitorStation = 监测站（String）
     */
    @RequestMapping(value = "/add",method = RequestMethod.POST)
    public ResultVO add(@Valid Air air, BindingResult bindingResult) throws IOException {
        /*
        采用JSR303规范的方式校验
        1.导入hibernate-validator依赖，版本太高，就会凉凉
        2.在实体类的属性上添加注解，指定校验的方式
        3.在controller方法接收参数的实体类前，追加@Valid，代表开启注解校验
        4.为了更方便给页面提示信息，在JSR303的注解后，追加message属性
        5.在接收参数的实体类后，追加BindingResult的形参，来接收参数校验的情况
         */
        if(bindingResult.hasErrors()){//判断是否有参数未通过校验  有：true,没有：false
            //如果有参数未通过校验，获得具体的message属性信息
            String message = bindingResult.getFieldError().getDefaultMessage();
            return R.error(400,message);
        }

        airService.save(air);

        return R.ok();
    }

    /**
     * 删除空气质量信息
     * # 请求路径和请求方式
     * GET	http://localhost:8080/air/delete
     * # 请求参数
     *   id = 1 （int）id值
     */
    @GetMapping("/delete")
    public ResultVO delete(Integer id){
        if(id==null){
            return R.error(400,"id必须传值，不能为空" );
        }

        airService.deleteById(id);

        return R.ok();

    }

    /**
     * # 请求路径和请求方式
     *   POST	http://localhost:8080/air/update
     * # 请求参数
     *   id = 1 （int）id值
     *   districtId = 区域标识（int）
     *   monitoringTime = 检测日期（Date）
     *   pm10 = pm10数值（int）
     *   pm25 = pm2.5数值（int）
     *   monitorStation = 监测站（String）
     */
    @PostMapping("/update")
    public ResultVO update(@Valid Air air,BindingResult bindingResult){
        if(bindingResult.hasErrors()||air.getId() == null){
            FieldError fieldError = bindingResult.getFieldError();
            String msg = null;
            if(fieldError ==null){
                msg ="id必须传值，岂能为空";
            }else{
                msg = fieldError.getDefaultMessage();
            }

            return R.error(400,msg );

        }
        airService.updateById(air);

        return R.ok();
    }




}
